#include<iostream>
#include"parsing.h"
#include<cstring>
#include<cstdlib>
#include<string.h> 
#include<vector>

using namespace std;


Parsing::Parsing(){

    //Inicializo el vector de mensajes desde aquí porque no cambian

    mismensajes.push_back("before_kick_off");
    mismensajes.push_back("play_on");
    mismensajes.push_back("corner_kick_l");
    mismensajes.push_back("corner_kick_r");
    mismensajes.push_back("drop_ball");
    mismensajes.push_back("offside_l");
    mismensajes.push_back("offside_r");
    mismensajes.push_back("half_time");
    mismensajes.push_back("time_over");
    mismensajes.push_back("time_up_without_a_team");
    mismensajes.push_back("time_up");
    mismensajes.push_back("time_extended");
    mismensajes.push_back("kick_off_l");
    mismensajes.push_back("kick_off_r");
    mismensajes.push_back("kick_in_l");
    mismensajes.push_back("kick_in_r");
    mismensajes.push_back("free_kick_l");
    mismensajes.push_back("free_kick_r");
    mismensajes.push_back("foul_l");
    mismensajes.push_back("foul_r");
    mismensajes.push_back("goal_kick_l");
    mismensajes.push_back("goal_kick_r");
    mismensajes.push_back("goal_l");
    mismensajes.push_back("goal_r");
    mismensajes.push_back("goalie_catch_ball_l");
    mismensajes.push_back("goalie_catch_ball_r");

}

/*Los mensajes del arbitro que manda el servidor son del tipo hear, por lo
  que he dejado comentado el caso f */

int Parsing::seleccion(char *mensaje)
{
    char inicio[5];

    strncpy(inicio, mensaje, 5);

    //Detecta si el mensaje contiene la palabra referee
    char *pointer = strstr (mensaje,"referee");

    switch (inicio[3])
    {
    case 'i':    //conectado
        return 1;
        break;
    case 'c':     //reconectado
        return 2;
        break;
    case 'r':    //error
        return 3;
        break;

    /*case 'f':    //arbitro
        return 4;
        break;*/

    case 'e':    //vista
        return 5;
        break;
    case 'a':    //oido

        /*Si el pointer no es nulo significa que el emisor es del arbitro
          por eso devuelve lo mismo que el caso f */

        if(pointer!=NULL){
            return 4;
        }

        else{ //Para cualquier otro emisor
            return 6;
        }
        break;
    case 'n':    //estado
        return 7;
        break;
    default:
        return 0;
    }
}

/*El mensaje que le llega a esta función es la cadena completa que se
  recibe del servidor, la función se encarga de separarla y analizarla*/

int Parsing::getMensajeArbitro(char *message){

    char *orden, *men; //Cadenas auxiliares para guardar los "tokens"

    orden=strtok (message," ())");

    while (orden!=NULL)
    {
       men=orden;
       orden=strtok(NULL," ())");
    }


    int pos=-1; //posición del vector
    int aux, aux2;//aux2 es el resultado de strcmp (0 si las cadenas son iguales)

    for(aux=0; aux<mismensajes.size(); aux++){

        aux2=strcmp(men, mismensajes[aux]);

        if (aux2==0){

            pos=aux;

        }

    }

    cout<<pos<<endl;

    return pos;

}

/* Este es el vector de mensajes del arbitro, donde se puede ver la posición
de cada mensaje que es el valor que devuelve la función getMensajeArbitro.


    mismensajes[0]="before_kick_off";
    mismensajes[1]="play_on";
    mismensajes[2]="corner_kick_l";
    mismensajes[3]="corner_kick_r";
    mismensajes[4]="drop_ball";
    mismensajes[5]="offside_l";
    mismensajes[6]="offside_r";
    mismensajes[7]="half_time";
    mismensajes[8]="time_over";
    mismensajes[9]="time_up_without_a_team";
    mismensajes[10]="time_up";
    mismensajes[11]="time_extended";
    mismensajes[12]="kick_off_l";
    mismensajes[13]="kick_off_r";
    mismensajes[14]="kick_in_l";
    mismensajes[15]="kick_in_r";
    mismensajes[16]="free_kick_l";
    mismensajes[17]="free_kick_r";
    mismensajes[18]="foul_l";
    mismensajes[19]="foul_r";
    mismensajes[20]="goal_kick_l";
    mismensajes[21]="goal_kick_r";
    mismensajes[22]="goal_l";
    mismensajes[23]="goal_r";
    mismensajes[24]="goalie_catch_ball_l";
    mismensajes[25]="goalie_catch_ball_r";

*/

/*
bool Parsing::posicion (float *x, float *y, char *mensaje)
{
    int i = 7;
    list <Marca> flags;
    Marca flag;
    x=0;
    y=0;


    do			//leemos toda la cadena y cada flag la almacenamos en la lista
       {
        if (mensaje[i]=='f' && mensaje [i+1] =='l') 
	    flag.fill(i, mensaje) 
            flags.push_front(flag);
       }
    while((i+1)>strlen(mensaje);
	if (flags.size()=0)
		return 0;
    float sumadist=0;
   list<Marca>::iterator it;
    for (it=flags.begin(); it!=flags.end();it++) 
    {
	sumadist=sumadist+((*it).dist^2);	 //calculamos la suma del cuadrado de todas las distancias
        x=x+((cos((*it).ang)*(*it).dis)*((*it).dis^2));
        y=y+((sin((*it).ang)*(*it).dis)*((*it).dis^2));    //sumamos la posición absoluta multiplicada por el cuadrado de la distancia a cada flag
    }
	x=x/sumadist;		//ponderamos segun el cuadrado de la distancia. Las flag mas cercanas cuentan mas, ya que son mas precisas
	y=y/sumadist;

return 1;
}
*/

void Parsing::balon(char* mensaje)
{
    cout<<"\n\n---GETBALL---\n\n";

    char cadena [500];
    int i=0,n=0,k=0;
    int espacios;
    char numero[8];
    float BALL[4];
    int found;


    strcpy(cadena,mensaje);
    string str(cadena);

    cout<<"MENSAJE: "<<cadena;

    found=str.find("ball");
    cout<<"\nfound: "<<found<<endl;
    if(found!=-1)
    {
                for(i=found+5, n=0, k=0, espacios=0; espacios<4; i++,n++)
                {
                    numero[n]=cadena[i];
                    if(cadena[i]==32||cadena[i]==')')
                    {
                        BALL[k]=atof(numero);
                        cout<<"\nParametro"<<k+1<<" = "<<BALL[k];
                        k++;
                        n=-1;
                        espacios++;
                        bzero(numero, 8);


                    }
                }
    }else cout<<"no hay ball";


    bzero(cadena,500);

}

void Parsing::jugadores(char* mensaje)
{


    cout<<"\n\n---GETPLAYERS---\n\n";

    char cadena [500];
    int i=0,n=0,k=0;
    int espacios;
    char numero[8];
    int dorsal;
    float PLAYER[23][6]; //La primera posicion es el dorsal, 1-11 para amigos, 12-22 para rivales
                         //La segunda posicion es ocupada por los parámetros (max. 6)
    int found;


    strcpy(cadena,mensaje);
    string str(cadena);

    cout<<"MENSAJE: "<<cadena;

    found=str.find("player 734M");
    cout<<"\nfound: "<<found<<endl;
    if(found!=-1)
    {
        ///Si entra aquí significa que hemos encontrado un jugador
        bzero(numero,8);
        for(i=found+11,n=0;cadena[i]!=')';i++,n++)
        {
            numero[n]=cadena[i];
        }

        dorsal=atof(numero); //El dorsal de nuestro jugadores estará entre 1 y 11
        cout<<"\nJugador amigo con el dorsal "<<dorsal<<endl;
        bzero(numero,8);

        for(n=0, k=0, i=i+2, espacios=0; espacios<8; i++,n++)
        {
            numero[n]=cadena[i];
            if(cadena[i]==32||cadena[i]==')')
            {
                if(cadena[i]==')') espacios=9;
                PLAYER[dorsal][k]=atof(numero);
                cout<<"\nParametro"<<k+1<<" = "<<PLAYER[dorsal][k];
                k++;
                n=-1;
                espacios++;
                bzero(numero, 8);


            }
        }
    }


    bzero(cadena,500);
}



